// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
// import com.alibaba.druid.util.FnvHash;

// import java.sql.Types;
// import java.util.Collections;
// import java.util.List;
#pragma once
#include "SQLObjectImpl.h"
#include "SQLDataType.h"

class SQLMapDataType
    : virtual public SQLObjectImpl,
      virtual public SQLDataType
{
public:
  static SQLMapDataType_ptr MAP_CHAR_CHAR;

  DbType_ptr dbType;
  SQLDataType_ptr keyType;
  SQLDataType_ptr valueType;

  SQLMapDataType();

  SQLMapDataType(SQLDataType_ptr keyType, SQLDataType_ptr valueType);

  SQLMapDataType(SQLDataType_ptr keyType, SQLDataType_ptr valueType, DbType_ptr dbType);
  SHAREDOBJECT(SQLMapDataType);

  // @Override
  string_ptr getName();

  // @Override
  long nameHashCode64();

  // @Override
  void setName(string_ptr name);

  // @Override
  SQLExpr_list_ptr getArguments();

  // @Override
  BOOL_ptr getWithTimeZone();

  // @Override
  void setWithTimeZone(BOOL_ptr value);

  // @Override
  BOOL_ptr isWithLocalTimeZone();

  // @Override
  void setWithLocalTimeZone(BOOL_ptr value);

  // @Override
  void setDbType(DbType_ptr dbType);

  // @Override
  DbType_ptr getDbType();

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLObject_ptr clone();

  SQLDataType_ptr getKeyType();

  void setKeyType(SQLDataType_ptr x);

  SQLDataType_ptr getValueType();

  void setValueType(SQLDataType_ptr x);

  int jdbcType();

  // @Override
  BOOL_ptr isInt();

  // @Override
  BOOL_ptr isNumberic();

  // @Override
  BOOL_ptr isString();

  // @Override
  BOOL_ptr hasKeyLength();
};
